#include "public.h"
#include <stdio.h>
#include "seg.h"
#include "timer.h"
#include "key.h"
#include "ds1302.h"
#include "ds18b20.h"

//数码管显示：显示位置,字符段码,显示的字符
uchar pos = 0, seg_str[16], seg_buf[8];
uchar show_mode = 1;  //显示模式：1时间，2日期，3温度
uint c_tran_mode = 0; //模式切换计数器

//按键 
uchar key_val,key_old;

//ds1302
extern uchar DS1302_time[]; //时间
uint c_get_time = 0; //获取时间频率计数器

//ds18b20
float ds18b20_temp = 0;
uint c_get_temp = 0; //测温频率计数器

//其他变量


//*******************函数声明*******************
void seg_proc();
void key_proc();
void ds1302_proc();
void ds18b20_proc();


//*******************main主程序*******************
void main() {
	sys_init();
	timer1_init();
	DS1302_init();
	
	while(1) {
		ds1302_proc();
		ds18b20_proc();
		key_proc();
		seg_proc();
	}
}

//*******************中断服务函数*******************
void t1_isr() interrupt 3 {
	TH1 = (65535-2000)/256;
	TL1 = (65535-2000)%256;
	
	//数码管显示
	seg_disp(pos, seg_buf);
	if(++pos >= 8) pos = 0;
}

//*******************按键*******************
void show_mode_key() {
	//显示模式切换
	switch(show_mode) {  
		case 1: 
			show_mode = 2;   //切换下一模式
		break;
		case 2: 
			show_mode = 3;
		break;
		case 3: 
			show_mode = 1;
		break;
	}
}

void key_proc() {
	//读取按键按下的编号
	key_val = key_scan_btn();
	//key_val = key_scan(); //读取按键按下的编号
	key_val = key_val & (key_old^key_val);
	key_old = key_val;
	if(key_val == 4) {
		show_mode_key();
	}
}

//*******************DS18B20温度*******************
void ds18b20_proc() {
	if(++c_get_temp >= 800) {
		c_get_temp = 0;
		ds18b20_temp = DS18B20_readTemp();
	}
}

//*******************DS1302时钟*******************
void ds1302_proc() {
	if(++c_get_time >= 200) {
		c_get_time = 0;
		DS1302_getTime();
	}
}

//*******************数码管*******************
void show_mode_tran() {
	//时间显示模式切换
	if(++c_tran_mode >= 5000) {
		switch(show_mode) {  
			case 1: 
				show_mode = 2;   //切换下一模式
				c_tran_mode = 4000; //设置下一模式的显示时长
			break;
			case 2: 
				show_mode = 3;
				c_tran_mode = 4000;
			break;
			case 3: 
				show_mode = 1;
				c_tran_mode = 0;
			break;
		}
	}	
}

void seg_proc() {
	//show_mode_tran();
	
	//待显示的字符数组
	switch(show_mode) {
		case 1:
			sprintf(seg_str, "%02d-%02d-%02d",
			(uint)DS1302_time[4], (uint)DS1302_time[5], (uint)DS1302_time[6]);
		break;
		case 2:
			sprintf(seg_str, "%02d-%02d-%02d",
			(uint)DS1302_time[0], (uint)DS1302_time[2], (uint)DS1302_time[3]);
		break;
		case 3:
			sprintf(seg_str, "C    %03.1f", ds18b20_temp);
		break;
	}
	
	//将字符转换为段码
	seg_tran(seg_str, seg_buf);
}


